package ds.factcom.repository;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import ds.factcom.domain.Domain;
import ds.factcom.exception.NotExistDomainException;

/**
 * La clase base dao se encarga de manejar todas las cciones basicas de la una entidad, desde insertar hasta borrar
 * posee busquedas genericas de entidades.
 * 
 * @author Javier De Luca, Maximiliano Herrera, Matias Samblancat
 *
 * @param <Entity> Es un generic que permite que las clases que se marcan en la generacion solo sean
 * domains
 */
public abstract class BaseRepository<Entity extends Domain> {

	private List<Entity> listEntities = new ArrayList<Entity>();
	
	/**
	 * inserta la entidad a la lista de entidades
	 * @param entity
	 */
	public void insert(Entity entity){
		getAllEntities().add(entity);
	}
	
	/**
	 * borra una entidad buscanda por el id
	 */
	public void delete(Entity entity){
		getAllEntities().remove(entity);
	}
	
	/**
	 * busca una entidad por medio del id
	 * @param id de busqueda
	 * @return devuelve la entidad encontrada
	 * @throws NotExistDomainException si no existe la entidad
	 */
	public Entity findEntityById(Integer id) throws NotExistDomainException {
		for (Iterator<Entity> iterator = listEntities.iterator(); iterator.hasNext();) {
			Entity entity = (Entity) iterator.next();
			if(entity.getId().equals(id)){
				return entity;
			}
		}
		throw new NotExistDomainException("La entidad");
	}

	/**
	 * busca la lista entera de entidades
	 * @return lista de entidades
	 */
	public List<Entity> getAllEntities(){
		return listEntities;
	}
	
	public Entity findByEntity(Entity entity) throws NotExistDomainException {
		boolean found = false;
		for (Iterator<Entity> iterator = getAllEntities().iterator(); iterator.hasNext();) {
			Entity oldEntity = (Entity) iterator.next();
			if(oldEntity.equals(entity)){
				found = true;
				return oldEntity;
			}
		}
		if (!found)
			throw new NotExistDomainException(entity.getClass().getSimpleName());
		return null;
	}
}
